package com.cool.shark.web;

import com.cool.shark.ex.ServiceException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @Name: JsonResult
 * @Author: 西风残叶
 * @Date: 2024/3/29 21:41
 * @Version: 1.0
 * @TODO: Json响应对象
 */
@Data
public class JsonResult<T> implements Serializable {
    @ApiModelProperty("业务状态码")
    private Integer state;
    @ApiModelProperty("错误信息")
    private String message;
    @ApiModelProperty("业务数据")
    private T data;


    /**
     * 操作成功的JsonResult对象
     */
    public static final int OK = 1;

    public static <T> JsonResult<T> ok() {
        return ok(null);
    }

    /**
     * 生成表示操作成功的 JsonResult 对象。
     *
     * @param data 要包含在 JsonResult 中的数据。
     * @param <T>  数据的类型。
     * @return 包含成功状态和指定数据的 JsonResult 对象。
     */
    public static <T> JsonResult<T> ok(T data) {
        JsonResult<T> jsonResult = new JsonResult<>();
        jsonResult.setState(ServiceCode.OK.getValue());
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 生成失败的JsonResult。
     *
     * @param e ServiceException 异常对象，包含服务代码和错误信息。
     * @return JsonResult 表示操作失败的Json结果。
     */
    public static JsonResult fail(ServiceException e) {
        // 根据ServiceException异常对象生成失败的JsonResult
        return fail(e.getServiceCode(), e.getMessage());
    }

    /**
     * 创建一个表示操作失败的 JsonResult 对象。
     *
     * @param state   操作的状态码，用 ServiceCode 枚举类型表示操作的状态。
     * @param message 操作失败时的详细信息 message。
     * @return 返回一个配置了失败状态和消息的 JsonResult 对象。
     */
    public static <T> JsonResult<T> fail(ServiceCode state, String message) {
        JsonResult jsonResult = new JsonResult();
        // 设置返回结果的状态为传入的状态码值
        jsonResult.setState(state.getValue());
        // 设置返回结果的消息为传入的消息
        jsonResult.setMessage(message);
        return jsonResult;
    }
}